<?php

class UCenterClient_UserInterface
{
    protected function __construct()
    {
    }

    static function instance()
    {
        static $instance;
        if (is_null($instance)) $instance = new UCenterClient_UserInterface();
        return $instance;
    }

    /**
     * 注册用户并返回新用户ID，失败抛出异常
     */
    function register($username, $password, $email, $question_id = UCenterClient::NO_QUESTION, $answer = '')
    {
        /**
         * integer uc_user_register(string username , string password , string email [, integer questionid , string answer])
         *
         * 函数参数
         * 参数             含义
         * string username  用户名
         * string password  密码
         * string email     电子邮件
         * integer questionid 安全提问索引
         * string answer    安全提问答案
         *
         * 返回值(integer)
         * 值           含义
         * 大于 0:      返回用户 ID，表示用户注册成功
         * -1:          用户名不合法
         * -2:          包含不允许注册的词语
         * -3:          用户名已经存在
         * -4:          Email 格式有误
         * -5:          Email 不允许注册
         * -6:          该 Email 已经被注册
         *
         * 本接口函数用于新用户的注册。
         * 用户名、密码、Email 为一个用户在 UCenter 的基本数据，提交后 UCenter 会按照注册设置和词语过滤的规则检测用户名和 
         * Email 的格式是否正确合法，如果正确则返回注册后的用户 ID，否则返回相应的错误信息。
         */

        $uid = uc_user_register($username, $password, $email, $question_id, $answer);
        if ($uid > 0) return $uid;

        switch ($uid)
        {
        case -1:
            throw new UCenterClient_IllegalCharsException($username);
        case -2:
            throw new UCenterClient_ReservedWordException($username);
        case -3:
            throw new UCenterClient_ExistsUsernameException($username);
        case -4:
            throw new UCenterClient_InvalidEmailException($email);
        case -5:
            throw new UCenterClient_ReservedWordException($email);
        case -6:
            throw new UCenterClient_ExistsEmailException($email);
        default:
            throw new UCenterClient_Exception($username);
        }
    }

    /**
     * 验证用户登录并返回用户对象，失败抛出异常
     *
     * @param string $username
     * @param string $password
     * @param boolean $is_uid
     *
     * @return QDB_ActiveRecord_Abstract
     */
    function login($username, $password, $is_uid = UCenterClient::NOT_UID, $check_question = 0, $question_id = UCenterClient::NO_QUESTION, $answer = '')
    {
        /**
         * array uc_user_login(string username , string password [, bool isuid , bool checkques , integer questionid , string answer])
         *
         * 函数参数
         * 参数                 含义
         * string username      用户名 / 用户 ID
         * string password      密码
         * bool isuid           是否使用用户 ID登录
         *      1: 使用用户     ID登录
         *      0: (默认值)     使用用户名登录
         * bool checkques       是否验证安装提问
         *      1: 验证安全提问
         *      0: (默认值) 不验证安全提问
         * integer questionid   安全提问索引
         * string answer        安全提问答案
         *
         * 返回值(array)
         * 值           含义
         * integer [0]  大于 0:返回用户 ID，表示用户登录成功
         *              -1: 用户不存在，或者被删除
         *              -2: 密码错
         *              -3: 安全提问错
         * string [1]   用户名
         * string [2]   密码
         * string [3]   Email
         * bool [4]     用户名是否重名
         *
         * 本接口函数用于用户的登录验证，用户名及密码正确无误则返回用户在 UCenter 的基本数据，否则返回相应的错误信息。
         * 如果应用程序是升级过来的，并且当前登录用户和已有用户重名，那么返回的数组中 [4] 的值将返回 1。
         */
        $arr = uc_user_login($username, $password, $is_uid);

        if (is_array($arr) && count($arr) >= 5)
        {
            switch ($arr[0])
            {
            case -1:
                throw new UCenterClient_NotExistsUsernameException($username);
            case -2:
                throw new UCenterClient_InvalidPasswordException($username);
            case -3:
                throw new UCenterClient_InvalidAnswerException($username);
            }

            if ($arr[0] > 0) return $arr;
        }

        throw new UCenterClient_Exception($username);
    }

    /**
     * 查询指定用户，失败返回 false
     *
     * @param string $username
     * @param boolean $is_uid
     *
     * @return array
     */
    function get($username, $is_uid = UCenterClient::NOT_UID)
    {
        /**
         * array uc_get_user(string username [, bool isuid])
         *
         * 函数参数
         * 参数             含义
         * string username  用户名
         * bool isuid       是否使用用户 ID获取
         *      1: 使用用户 ID获取
         *      0: (默认值) 使用用户名获取
         *
         * 返回值(array)
         * 值           含义
         * integer [0]  用户 ID
         * string [1]   用户名
         * string [2]   Email
         *
         * 本接口函数用于获取用户在 UCenter 的基本数据，如用户不存在，返回值为 integer 的数值 0
         */

        $arr = uc_get_user($username, $is_uid);
        if (!is_array($arr) || !isset($arr[0]) || $arr[0] < 1) return false;
        return $arr;
    }

    /**
     * 更新用户资料，失败抛出异常
     *
     * @param string $username
     * @param string $old_password
     * @param string $new_password
     * @param string $new_email
     * @param boolean $ignoreoldpw
     */
    function edit($username, $old_password, $new_password, $new_email, $ignoreoldpw = false, $question_id = UCenterClient::NO_QUESTION, $answer = '')
    {
        /**
         * integer uc_user_edit(string username , string oldpw , string newpw , string email [, bool ignoreoldpw, integer questionid , string answer])
         *
         * 函数参数
         * 参数                 含义
         * string username      用户名
         * string oldpw         旧密码
         * string newpw         新密码，如不修改为空
         * string email         Email，如不修改为空
         * bool ignoreoldpw     是否忽略旧密码
         *      1: 忽略，更改资料不需要验证密码
         *      0: (默认值) 不忽略，更改资料需要验证密码
         * integer questionid   安全提问索引
         * string answer        安全提问答案
         *
         * 返回值
         *  值      含义
         *  1:      更新成功
         *  0:      没有做任何修改
         * -1:      旧密码不正确
         * -4:      Email 格式有误
         * -5:      Email 不允许注册
         * -6:      该 Email 已经被注册
         * -7:      没有做任何修改
         * -8:      该用户受保护无权限更改
         *
         * 本接口函数用于更新用户资料。更新资料需验证用户的原密码是否正确，除非指定 ignoreoldpw 为 1。
         * 如果只修改 Email 不修改密码，可让 newpw 为空；同理如果只修改密码不修改 Email，可让 email 为空。
         */
        $ret = uc_user_edit($username, $old_password, $new_password, $new_email, $ignoreoldpw, $question_id, $answer);

        switch ($ret)
        {
        case 1:
        case 0:
        case -7:
            return;
        case -1:
            throw new UCenterClient_InvalidPasswordException($username);
        case -4:
            throw new UCenterClient_InvalidEmailException($username, $new_value);
        case -5:
            throw new UCenterClient_ReservedWordException($username, $new_value);
        case -6:
            throw new UCenterClient_ExistsEmailException($username, $new_value);
        case -8:
            throw new UCenterClient_ProtectedUser($username);
        default:
            throw new UCenterClient_Exception($username);
        }
    }

    /**
     * 删除指定的用户，失败抛出异常
     *
     * @param string|array $username
     */
    function delete($username)
    {
        /**
         * integer uc_user_delete(string/array username)
         *
         * 函数参数
         * 参数                 含义
         * string username      用户名
         *
         * 返回值(integer)
         *  值      含义
         *  1:      成功
         *  0:      失败
         */

        $ret = uc_user_delete(Q::normalize($username));
        if ($ret) return;

        throw new UCenterClient_DeleteUserFailedException($username);
    }

    /**
     * 返回指定ID用户的同步登录代码
     *
     * @return string
     */
    function synLogin($uid)
    {
        /**
         * string uc_user_synlogin(integer uid)
         *
         * 函数参数
         * 参数         含义
         * integer uid  用户 ID
         *
         * 返回值(string)
         * 值           含义
         * 同步登录的 HTML 代码
         *
         * 如果当前应用程序在 UCenter 中设置允许同步登录，那么本接口函数会通知其他设置了同步登录的应用程序登录，
         * 把返回的 HTML 输出在页面中即可完成对其它应用程序的通知。输出的 HTML 中包含执行远程的 javascript 脚本，
         * 请让页面在此脚本运行完毕后再进行跳转操作，否则可能会导致无法同步登录成功。
         * 同时要保证同步登录的正确有效，请保证其他应用程序的 Cookie 域和 Cookie 路径设置正确。
         */

        return uc_user_synlogin($uid);
    }

    /**
     * 返回同步退出登录代码
     *
     * @return string
     */
    function synLogout()
    {
        /**
         * string uc_user_synlogout()
         *
         * 返回值(string)
         * 值       含义
         * 同步退出的 HTML 代码
         *
         * 如果当前应用程序在 UCenter 中设置允许同步登录，那么本接口函数会通知其他设置了同步登录的应用程序退出登录，
         * 把返回的 HTML 输出在页面中即可完成其它应用程序的通知。输出的 HTML 中包含执行远程的 javascript 脚本，
         * 请让页面在此脚本运行完毕后再进行跳转操作，否则可能会导致无法同步退出登录。
         * 同时要保证同步退出登录的正确有效，请保证其他应用程序的 Cookie 域和 Cookie 路径设置正确。
         */

        return uc_user_synlogout();
    }

    /**
     * 检查指定的电子邮件地址是否已经存在
     *
     * @param string $email
     *
     * @return boolean
     */
    function checkEmail($email)
    {
        /**
         * integer uc_user_checkemail(string email)
         * 
         * 函数参数
         * 参数             含义
         * string email     Email
         *
         * 返回值(integer)
         * 值       含义
         *  1:      成功
         * -4:      Email 格式有误
         * -5:      Email 不允许注册
         * -6:      该 Email 已经被注册
         *
         * 本接口函数用于检查用户输入的 Email 的合法性。
         */

        $ret = uc_user_checkemail($email);
        switch ($ret)
        {
        case 1:
            return true;
        case -6:
            return false;
        case -4:
            if (!$throw) return false;
            throw new UCenterClient_ReservedWordException($username);
        default:
            if (!$throw) return false;
            throw new UCenterClient_IllegalCharsException($username);
        }
    }


    /**
     * 检查指定的用户名是否存在
     *
     * @param string $username
     * @param boolean $throw
     *
     * @return boolean
     */
    function checkUsername($username, $throw = UCenterClient::NO_EXCEPTION)
    {
        /**
         * integer uc_user_checkname(string username)
         *
         * 函数参数
         * 参数             含义
         * string username  用户名
         *
         * 返回值
         *  值      含义
         *  1:      成功
         * -1:      用户名不合法
         * -2:      包含要允许注册的词语
         * -3:      用户名已经存在
         *
         * 本接口函数用于检查用户输入的用户名的合法性。
         */

        $ret = uc_user_checkname($username);
        switch ($ret)
        {
        case 1:
            return true;
        case -3:
            return false;
        case -1:
            if (!$throw) return false;
            throw new UCenterClient_IllegalCharsException($username);
        case -2:
            if (!$throw) return false;
            throw new UCenterClient_ReservedWordException($username);
        default:
            throw new UCenterClient_Exception($username);
        }
    }

    /**
     * 添加保护用户，失败抛出异常
     *
     * @param string|array $username
     * @param string $admin
     */
    function addProtected($username, $admin)
    {
        /**
         * integer uc_user_addprotected(string/array username , string admin)
         *
         * 函数参数
         * 参数                     含义
         * string/array username    保护用户名
         * string admin             操作的管理员
         *
         * 返回值(integer)
         *  值      含义
         *  1:      成功
         * -1:      失败
         *
         * 本接口函数用于添加被保护的用户。
         */

        if (uc_user_addprotected(Q::normalize($username), $admin) != 1)
        {
            throw new UCenterClient_Exception($username);
        }
    }

    /**
     * 删除保护用户，失败抛出异常
     *
     * @param string|array $username
     */
    function deleteProtected($username)
    {
        /**
         * integer uc_user_deleteprotected(string/array username)
         * 
         * 函数参数
         * 参数                     含义
         * string/array username    保护用户名
         *
         * 返回值(integer)
         *  值      含义
         *   1:     成功
         *  -1:     失败
         *
         * 本接口函数用于删除被保护的用户。
         */

        if (uc_user_deleteprotected(Q::normalize($username)) != 1)
        {
            throw new UCenterClient_Exception($username);
        }
    }

    /**
     * 得到受保护的用户名列表
     *
     * return array
     */
    function getProtected()
    {
        /**
         * integer uc_user_getprotected()
         *
         * 返回值
         * 值       含义
         * array    受保护的用户数据
         *
         * 本接口函数用于获得被保护的用户列表。
         */
        return uc_user_getprotected();
    }

}


